package cn.tedu.loding.service.impl;

import cn.tedu.loding.ex.ServiceException;
import cn.tedu.loding.mapper.CartMapper;
import cn.tedu.loding.mapper.ProductMapper;
import cn.tedu.loding.pojo.dto.CartAddNewDTO;
import cn.tedu.loding.pojo.entity.Cart;
import cn.tedu.loding.pojo.vo.*;
import cn.tedu.loding.service.ICartService;
import cn.tedu.loding.service.IProductService;
import cn.tedu.loding.web.ServiceCode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 处理购物车数据的业务实现类
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Slf4j
@Service
public class CartServiceImpl implements ICartService {

    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private ProductMapper productMapper;
    @Autowired
    private IProductService productService;


    public CartServiceImpl() {
        log.debug("创建业务对象：CartServiceImpl");
    }


    // 分页查询所有购物车信息的方法
// 参数page是页码,pageSize是每页条数
    public PageInfo<CartListVO> getAllCartByPage(Integer page, Integer pageSize){
        // Pagehepler框架实现分页功能最核心的代码,是要编写在执行查询数据库代码之前的
        // PageHelper.startPage方法就是在设置分页的查询条件
        // page是查询的页码(从1开始),pageSize是每页条数
        PageHelper.startPage(page,pageSize);
        // 上面设置好分页查询条件,下面的查询在执行时,sql语句会自动被追加limit关键字
        List<CartListVO>list= cartMapper.list();

        // list变量并不是全查结果,而是只包含指定页码内容的数据
        // 我们分页业务功能不能只返回分页查询结果,还需要提供分页信息
        // PageHelper框架提供了PageInfo类,既能保存分页结果,也能保存分页信息
        // 分页信息无需我们计算,直接实例化PageInfo对象,它会自动根据上面的查询生成
        return new PageInfo<>(list);
    }


    @Override
    public void addNew(CartAddNewDTO cartAddNewDTO) {
        log.debug("开始处理【添加购物车】的业务，参数：{}", cartAddNewDTO);
        // 从参数对象中获取购物车名称
        Long productId = cartAddNewDTO.getProductId();
        // 商品是否存在（商品表中是否存在此商品的数据）
        log.debug("商品表中是否存在此商品的数据");
        ProductStandardVO queryResult = productMapper.getStandardById(productId);
        if (queryResult==null) {
            // 是：此商品的不存在，添加购物车失败，抛出异常
            String message = "添加购物车失败，此商品的不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 否：此商品存在，则向购物车表中插入数据
        Cart cart = new Cart();
        cart.setOldPrice(queryResult.getOldPrice());
        cart.setVipPrice(queryResult.getVipPrice());
        cart.setGmtCreate(LocalDateTime.now());
        cart.setGmtModified(LocalDateTime.now());
        BeanUtils.copyProperties(cartAddNewDTO, cart);
        log.debug("即将插入购物车数据：{}", cart);
        int rows = cartMapper.insert(cart);
        if (rows != 1){
            String message = "添加购物车失败，服务器忙，请稍后再尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
        log.debug("插入购物车数据完成");
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【根据id删除购物车】的业务，参数：{}", id);
        // 调用Mapper对象的getStandardById()执行查询
        CartStandardVO queryResult = cartMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：无此id对应的数据，将不允许执行删除操作，则抛出异常
            String message = "删除购物车失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }


        // 调用Mapper对象的deleteById()方法执行删除
        log.debug("即将执行删除，参数：{}", id);
        int rows = cartMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除购物车失败，服务器忙，请稍后再尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
    }

    @Override
    public CartItemVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询购物车详情】的业务，参数：{}", id);
        CartStandardVO cart = cartMapper.getStandardById(id);
        if (cart == null) {
            String message = "获取购物车详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        ProductItemVO productItemVO = productService.getStandardById(cart.getProductId());
        log.debug("开始根据商品id【{}】查询商品结果为:{}",cart.getProductId(),productItemVO);
        CartItemVO cartItemVO = new CartItemVO();
        cartItemVO.setId(id);
        cartItemVO.setProductId(cart.getProductId());
        cartItemVO.setProductItemVO(productItemVO);
        cartItemVO.setCount(cart.getCount());
        log.debug("购物车中有:{}",cartItemVO);
        return cartItemVO;
    }

    @Override
    public List<CartItemVO> list() {
        log.debug("开始处理[查询购物车列表]得请求,无参数");
        List<CartListVO> cartLists = cartMapper.list();
        List<CartItemVO> cartListVOS = new ArrayList<>();

        for (CartListVO cartListVO:cartLists) {
            CartItemVO cartItemVO = new CartItemVO();
            ProductItemVO productItemVO = productService.getStandardById(cartListVO.getProductId());
            log.debug("开始根据商品id【{}】查询商品详情为:{}",cartListVO.getProductId(),productItemVO);
            cartItemVO.setId(cartListVO.getId());
            cartItemVO.setCount(cartListVO.getCount());
            cartItemVO.setUserId(cartListVO.getUserId());
            cartItemVO.setProductItemVO(productItemVO);
            cartListVOS.add(cartItemVO);
        }

        return cartListVOS;
    }

}
